# -*- coding: utf-8 -*-

'''
Created on 22 de Abr de 2011

@author: Samuel
'''

# processamento de HTML através do parser BeautifulSoup
from BeautifulSoup import BeautifulSoup
import re

# biblioteca para acesso através de protocolos de Internet
import urllib2


# escrita em csv
import csv
import sqlite3

class downloadInfo(object):

    # url base do sistema Rebides
    URL_REBIDES = 'http://www.rebides.oces.mctes.pt/Rebides0{0}'
    dados = ""
    result = ""
    conn = sqlite3.connect('rebides.db')
    cursor = conn.cursor()
    
    def updateUrl(self,ano):
        # formacao do Universal Resource Locator
        # a partir do ano
        
        url = self.URL_REBIDES.format(ano)
        return url
    

    def openConnection(self,url):    
        try:
            # abre a conexao para o site
            ficheiro = urllib2.urlopen( url )
        except:
            print "ERRO DE CONEXAO", url
            pass
    
    
        try:
            # leitura dos dados da pagina
            self.dados = ficheiro.read()
        except:
            print "ERRO de LEITURA"
            pass
        else:
            ficheiro.close()
            
    def readDatabase(self, query):
        if (self.conn == ""):
            self.conn = sqlite3.connect('rebides.db')
            self.cursor = self.conn.cursor()
        try:
            self.cursor.execute(query)
            r = self.cursor.fetchone()
            self.result = r[0].encode('utf-8') 
        except:
            pass    
            
    def writeDatabase(self, query):
       
        try:
            self.cursor.execute(query)
        except:
            #print "valor já inserido"
            pass
            
    
    def parserCodEstType(self):
        # processamento dos dados da página
        soup = BeautifulSoup(self.dados)
    
        # os codigos vao estar associados ao
        # tipo de estabelecimento
        d_tipos_estabelecimentos = {}
    
        lista = soup.findAll('a', )
        for x in lista:
            # href vai ter o conteudo da referencia em HTML
            href = x['href']
            
            # remove de href tudo menos o codigo
            href = re.sub('rebid\_m1\.asp\?codr\=', '', href)
            
            # o conteudo encontra-se do tag encontra-se aqui
            contents = x.contents
            
            # converte para utf-8
            tipo_estabelecimento = contents[0].encode('utf-8')
            d_tipos_estabelecimentos[ tipo_estabelecimento ] = href
            pass 
        return d_tipos_estabelecimentos
    

    def obter_codigos_tipo_estabelecimento(self,ano):
        '''
        a funcao obtem os codigos dos tipos de estabelecimento
        de ensino superior
        
        ano - ano a que se referem os dados
        '''
        # formacao do Universal Resource Locator
        # a partir do ano
        
        self.openConnection(self.updateUrl(ano));
    
        
       
        return self.parserCodEstType()    
 
   
 
    def get_codigos_tipo_estabelecimento_all(self):
        query = ""
        for ano in range(0,10):
            query = ("""INSERT INTO ano 
                    (ano) VALUES('{0}')""".format(ano))
           
            print "ANO: 200{0}".format(ano)
            d_tipos_estabelecimentos = self.obter_codigos_tipo_estabelecimento(ano)

            self.writeDatabase(query)
            for key, value in d_tipos_estabelecimentos.iteritems():
                print key, ':', value
                query = ( """INSERT INTO tipo_estabelecimento 
                             (tipoestabelecimento) VALUES
                             ('{0}') 
                          """.format(key,value))
                self.writeDatabase(query)
                pass
            
    def parserCodEst(self,codigo_tipo_estabelecimento, tipo_estabelecimento):
        # processamento dos dados da página
        soup = BeautifulSoup(self.dados)
    
        # os codigos vao estar associados ao
        # tipo de estabelecimento
        d_estabelecimentos = {}
    
        lista = soup.findAll('a', )
        for x in lista:
            # href vai ter o conteudo da referencia em HTML
            href = x['href']
    
            # remove de href tudo menos o codigo
            chave_procura = \
                'rebid\_m2\.asp\?CodR\={0}\&CodP\='.\
                format(codigo_tipo_estabelecimento)
    
            href = re.sub(chave_procura, '', href)
    
            # o conteudo encontra-se do tag encontra-se aqui
            contents = x.contents
            
            # converte para utf-8
            estabelecimento = contents[0].encode('utf-8')
            
            queryEstabelecimento = ("""INSERT INTO estabelecimento (nomeestabelecimento, tipoestabelecimento)
                                VALUES('{0}','{1}')""".format(estabelecimento, tipo_estabelecimento))
            self.writeDatabase(queryEstabelecimento)
            
            
            #Imprime os estabelecimentos
            print estabelecimento
            
            d_estabelecimentos[ estabelecimento ] = href
            pass
        return d_estabelecimentos          
    
    
    def obter_codigos_estabelecimentos(self,ano, codigo_tipo_estabelecimento, tipo_estabelecimento):
        '''
        a funcao obtem os codigos dos tipos de estabelecimento
        de ensino superior
        
        ano - ano a que se referem os dados
        '''
   
    
        # formacao do Universal Resource Locator
        # a partir do ano
        
        url = self.updateUrl(ano) + '/rebid_m1.asp?codr=' + codigo_tipo_estabelecimento
    
        self.openConnection(url)
    
       
    
        return self.parserCodEst(codigo_tipo_estabelecimento, tipo_estabelecimento)
    
    def get_codigo_estabelecimento_all(self):
        for ano in range(0,10):
       
            
            d_tipos_estabelecimento = self.obter_codigos_tipo_estabelecimento(ano)
            
            for tipo_estabelecimento, codigo_tipo_estabelecimento \
                    in d_tipos_estabelecimento.iteritems():
                d_estabelecimentos = \
                    self.obter_codigos_estabelecimentos(ano, codigo_tipo_estabelecimento, tipo_estabelecimento)
                contador = 0
                for key, value in d_estabelecimentos.iteritems():
                    self.obter_informacao_docentes(ano, tipo_estabelecimento , codigo_tipo_estabelecimento, key, value)
                    
                    contador += 1
                    pass
                
                #print value
                print key;
                print ano, \
                tipo_estabelecimento,'numero de estabelecimentos: ', contador
                queryAnotipo = ("""INSERT INTO anotipo(ano, tipoestabelecimento, quantidade)
                                VALUES('{0}','{1}','{2}')""".format(ano,tipo_estabelecimento,contador))               
                self.writeDatabase(queryAnotipo)    
                
                pass
            self.conn.commit()
            print "commit" 
            pass
        if ano == 10:
            self.cursor.close()
                
            
    
    
    
    def obter_informacao_docentes(self,ano, tipo, codR, estabelecimento, codP):
        '''
        codR - codigo do tipo de estabelecimento
        codP - codigo do estabelecimento
        '''
        C_NOME_COMPLETO = 1
        C_GRAU = 3
    
        # formacao do Universal Resource Locator
        # a partir do ano
      
        url = self.updateUrl(ano) + '/rebid_m2.asp?CodR=' + codR + '&CodP=' + codP 
    
        self.openConnection(url)
    
        # processamento dos dados da página
        soup = BeautifulSoup(self.dados)
        
        lista = soup.findAll('tr', )
        
        lista_docentes = []
    
        for x in lista:
            nome = x.contents[C_NOME_COMPLETO].contents[0]
            
            grau = x.contents[C_GRAU].contents[0]
            grau = grau.lstrip() 
          
    
            if nome != "NOME COMPLETO":
                if nome.encode('utf-8') != '&nbsp;':
                    nome_completo = nome
                    nome_completo = nome_completo.expandtabs()
                    novo_completo = re.sub('\015', '', nome_completo)
                    nome_completo = novo_completo.lstrip()
                    nome_completo = nome_completo.encode('utf-8')
                    
                    pass
    
                grau_completo = grau.encode('utf-8')
        
                queryGrau = ("""INSERT INTO grau (grau) VALUES ('{0}')""".format(grau));
                self.writeDatabase(queryGrau)
            
                
                queryDocente = ("""INSERT INTO docente (nomedocente) VALUES ('{0}')""".format(nome_completo))
                self.writeDatabase(queryDocente)
                
                queryGrauDocente =("""INSERT INTO graudocente (nomedocente, grau, ano, nomeestabelecimento) VALUES
                                    ('{0}','{1}','{2}','{3}')""".format(nome_completo, grau_completo,ano, estabelecimento))
                self.writeDatabase(queryGrauDocente)
                
                queryEstabelecimentoDocente=(""" INSERT INTO estabelecimentodocente (nomeestabelecimento, nomedocente, ano, tipoestabelecimento) VALUES
                                            ('{0}','{1}','{2}','{3}')""".format(estabelecimento, nome_completo, ano, tipo))
                self.writeDatabase(queryEstabelecimentoDocente)
                #print nome_completo.encode('utf-8')
                #print ano
                
                informacao_docente = [ nome_completo,
                                       grau_completo,
                                       ano,
                                       tipo,
                                       estabelecimento]
                lista_docentes.append(informacao_docente)
                pass
            pass
        return lista_docentes


